package controladores;

import java.util.List;

import org.apache.http.Header;
import org.apache.http.message.BasicHeader;

import android.util.Log;

import com.google.gson.Gson;

import utils.json.JSONParser;

import entidades.Caracteristica;
import entidades.Favorito;
import entidades.PuntoGeografico;
import entidades.Viaje;
import entidades.nopersistence.SolicitudPasajero;
import entidades.usuarios.Chofer;
import entidades.usuarios.Pasajero;
import utils.Constantes;
import utils.Encriptador;

public class ControladorPasajeros extends BaseControlador
{
	public ControladorPasajeros()
	{
		super(Constantes.URL_COMPLETA + Constantes.PASAJEROS);
	}

	/**
	 * Cancela el viaje activo. Un viaje es cancelable si su estado es sin
	 * chofer o asignado.
	 * 
	 * @param idViaje
	 *            la id del viaje a cancelar.
	 * @return true si se pudo completar la operacion.
	 */
	public boolean cancelarViaje(long idViaje)
	{
		String res = helper.doGet("cancelar?id=" + idViaje);

		if (res != null)
			return Boolean.valueOf(res);

		return false;
	}

	/**
	 * Finaliza el viaje activo. Un viaje solo es finalizable si su estado es
	 * iniciado.
	 * 
	 * @param idViaje
	 *            la id del viaje.
	 * @return true si se pudo completar la operacion.
	 */
	public boolean finalizarViaje(long idViaje)
	{
		String res = helper
				.doGet(Constantes.FINALIZAR_VIAJE + "?id=" + idViaje);

		if (res != null)
			return Boolean.valueOf(res);

		return false;
	}

	/**
	 * Envia una solicitud al sistema.
	 * 
	 * @param idPasajero
	 *            la id del pasajero solicitante.
	 * @param origen
	 *            el punto de origen.
	 * @param destino
	 *            el punto destino.
	 * @return el viaje si la operacion se pudo completar.
	 */
	public Viaje solicitar(long idPasajero, PuntoGeografico origen,
			PuntoGeografico destino, String comentario, List<Caracteristica> caracteristicas)
	{
		Log.i("LOG", "Controlador pasajeros - solicitando.");
		
		PuntoGeografico[] puntos;

		if (destino != null)
		{
			puntos = new PuntoGeografico[2];
			puntos[1] = destino;
		} else
			puntos = new PuntoGeografico[1];

		puntos[0] = origen;

		SolicitudPasajero solicitud = new SolicitudPasajero(puntos, idPasajero, comentario, caracteristicas);
		
		String res = helper.doPost(Constantes.Viajes.SOLICITAR, null, new Gson().toJson(solicitud));

		Log.i("LOG", "Controlador pasajeros, respuesta: " + res);
		
		if (res != null)
			return new JSONParser<Viaje>(Viaje.class).fromJson(res);

		return null;
	}

	/**
	 * Registra el codigo GCM del pasajero en el sistema.
	 * 
	 * @param idPasajero
	 *            la id del pasajero.
	 * @param gcm
	 *            el codigo GCM.
	 * @return true si la operacion se pudo completar.
	 */
	public boolean registrarGCM(long idPasajero, String gcm)
	{
		Header header = new BasicHeader("codigo", gcm);

		String res = helper.doPost("cargarCodigo?id=" + idPasajero, header,
				null);

		if (res != null)
			return Boolean.valueOf(res);

		return false;
	}

	/**
	 * Registra un pasajero en el sistema.
	 * 
	 * @param pasajero
	 *            el pasajero a registrar.
	 * @return el codigo de registro.
	 */
	public int registrarPasajero(Pasajero pasajero)
	{
		pasajero.setClave(Encriptador.encriptar(pasajero.getClave()));

		String res = helper.doPost(Constantes.Pasajeros.REGISTRO, null,
				new Gson().toJson(pasajero));

		if (res != null)
			return Integer.parseInt(res);

		return -1;
	}
	
	public int registrarPasajero (String emailChofer, String claveChofer)
	{
		Chofer chofer = new Chofer (emailChofer, Encriptador.encriptar(claveChofer));
		
		String res = helper.doPost(Constantes.Pasajeros.REGISTRAR_FROM_CHOFER, null, new Gson().toJson(chofer));
		
		if (res != null)
			return Integer.parseInt(res);
		
		return -1;
	}

	/**
	 * Inicia sesion sobre el pasajero dado.
	 * 
	 * @param pasajero
	 *            el pasajero que quiere iniciar sesion. Debe contener la ID y
	 *            la clave, sin encriptar.
	 * @param gcm
	 *            el codigo GCM.
	 * @return la id del pasajero.
	 */
	public long iniciarSesion(Pasajero pasajero, String gcm)
	{
		pasajero.setClave(Encriptador.encriptar(pasajero.getClave()));

		String res = helper.doPost(Constantes.Pasajeros.INICIAR_SESION,
				new BasicHeader("gcm", gcm), new JSONParser<Pasajero>(
						Pasajero.class).toJson(pasajero));

		if (res != null)
			return Long.parseLong(res);

		return -1;
	}

	public boolean cerrarSesion(long id)
	{
		String res = helper.doGet(Constantes.Pasajeros.CERRAR_SESION + "?id="
				+ id);
		Log.i("LOG", res);
		if (res != null)
			return Boolean.valueOf(res);

		return false;
	}
	
	public Pasajero checkDatos(String email, String clave)
	{
		Pasajero pasajero = new Pasajero(email, clave);
		pasajero.setClave(Encriptador.encriptar(pasajero.getClave()));

		String res = helper.doPost(Constantes.Pasajeros.CHECK_DATOS, null, new JSONParser<Pasajero>(Pasajero.class).toJson(pasajero));

		if (res != null)
			return new JSONParser<Pasajero>(Pasajero.class).fromJson(res);

		return null;
	}

	/**
	 * trae la lista de favoritos de pasajero
	 * 
	 * @param id
	 * @return null si hay error
	 */
	public List<Favorito> getFavoritos(long id)
	{
		String res = helper.doGet(Constantes.Pasajeros.FAVORITOS + "?id=" + id);
		if (res != null)
			return new JSONParser<Favorito>(Favorito.class).parseArray(res);

		return null;
	}

	public boolean agregarFavorito(long id, Favorito favorito)
	{
		PuntoGeografico punto = favorito.getPunto();
		if (punto != null)
		{
			String res = helper.doPost(Constantes.Pasajeros.GUARDAR_FAVORITOS
					+ "?id=" + id , null, new Gson().toJson(favorito));

			if (res != null)
				return Boolean.valueOf(res);
		}

		return false;
	}
}
